Java 8 Stream Api 中的 skip 和 limit 操作
1. 前言
Java 8 Stream API 中的skip()
和limit()
方法具有类似的作用。它们都是对流进行裁剪的中间方法。今天我们来探讨一下这两个方法。
2. skip()
skip(lang n)
是一个跳过前 n
个元素的中间流操作。我们编写一个简单的方法来进行skip
操作,将流剩下的元素打印出来。
public static void skip(long n) {
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);
integerStream.skip(n).forEach(integer -> System.out.println("integer = " + integer));
}
经过测试,当 n < 0
时直接抛出了 IllegalArgumentException
异常。毕竟要跳过一些元素,跟下象棋一个道理不能后退只能向前。当 n=0
时,原封不动完璧归赵。这种操作一般我们不会主动搞,没有意义。当 n=4
时,打印了 5
和 6
,由此可推断当我们取值大于等于流的大小时肯定什么也没有了,对于流来说肯定是个空流。经过检验确实count=0
。
也就是说 skip(long n)
方法跳过前 n
(非负)个元素,返回剩下的流,有可能为空流。
3. limit()
limit(long maxsize)
我们也如法炮制:
public static void limit(long maxsize) {
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);
integerStream.limit( maxsize).forEach(integer -> System.out.println("integer = " + integer));
}
当 n < 0
时直接抛出了 IllegalArgumentException
异常。当 n=0
时,返回一个空流。当 n=4
时,打印了 1
、 2
、3
、 4
。 n=8
时,打印了所有元素。感觉跟 mysq 的分页有异曲同工之妙。
4. 区别
这两个方法都是截取了流。但是它们有一些区别 skip
操作必须时刻监测流中元素的状态。才能判断是否需要丢弃。所以 skip
属于状态操作。
而 limit
只关心截取的是不是其参数 maxsize
(最大区间值),其它毫不关心。一旦达到就立马中断操作返回流。所以 limit
属于一个中断操作。
5. 总结
今天对Java Stream API 的 skip()
和limit()
方法进行了探讨。不知道你会想到在什么场景下会分别用到它们呢,不妨留言告诉我。